package com.medusa.aps.business.model.enums;

import com.alibaba.fastjson2.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.EnumValue;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Schema(description = "排产状态")
@RequiredArgsConstructor
public enum SchedulingStatusEnum {
    /**
     * 未排产
     */
    @Schema(description = "未排产")
    NOTARRANGED(0, "未排产", Boolean.TRUE),
    /**
     * 排产中
     */
    @Schema(description = "排产中")
    ARRANGING(1, "排产中", Boolean.FALSE),
    /**
     * 已排产
     */
    @Schema(description = "已排产")
    ARRANGED(2, "已排产", Boolean.FALSE),
    /**
     * 生产中
     */
    @Schema(description = "生产中")
    PRODUCING(3, "生产中", Boolean.FALSE),
    /**
     * 已完工
     */
    @Schema(description = "已完工")
    COMPLATED(4, "已完工", Boolean.FALSE),

    /**
     * 无需生产
     */
    @Schema(description = "无需生产")
    CLOSE(5, "无需生产", Boolean.FALSE),
    /**
     * 已终止
     */
    @Schema(description = "已终止")
    TERMINATION(6,"已终止",Boolean.FALSE),
    /**
     * 已完成(已完工、无需生产)
     * 此枚举用作查询参数，不落库
     */
    @Schema(description = "已完成")
    FINISHED(7,"已完成",Boolean.FALSE)
    ;
    /**
     * -- GETTER --
     * 获取编码
     *
     * @return 编码
     */
    @EnumValue
    private final int code;

    /**
     * -- GETTER --
     * 获取描述信息
     *
     * @return 描述信息
     */
    @JSONField(value = true)
    private final String value;

    /**
     * 是否可继续编辑
     */
    private final boolean editable;




    /**
     * 根据编码返回对应的SchedulingStatusEnum
     * 如果不存在对应的SchedulingStatusEnum，则返回null
     *
     * @param code 编码
     * @return SchedulingStatusEnum
     */
    public static SchedulingStatusEnum getEnumExampleByCode(int code) {
        //遍历当前的枚举类
        for (SchedulingStatusEnum enumExample : SchedulingStatusEnum.values()) {
            if (enumExample.getCode() == code) {
                return enumExample;
            }
        }
        return null;
    }

    /**
     * 根据描述信息返回对应的SchedulingStatusEnum
     * 如果不存在对应的SchedulingStatusEnum，则返回null
     *
     * @param value 描述信息
     * @return SchedulingStatusEnum
     */
    public static SchedulingStatusEnum getEnumExampleByValue(String value) {
        //遍历当前的枚举类
        for (SchedulingStatusEnum enumExample : SchedulingStatusEnum.values()) {
            if (value.equals(enumExample.getValue())) {
                return enumExample;
            }
        }
        return null;
    }

    /**
     * 根据编码返回对应的SchedulingStatusEnum的描述信息
     * 如果不存在对应的SchedulingStatusEnum，则返回null
     *
     * @param code 编码
     * @return 描述信息
     */
    public static String getValueByCode(int code) {
        SchedulingStatusEnum enumExample = getEnumExampleByCode(code);
        if (enumExample != null) {
            return enumExample.getValue();
        } else {
            return null;
        }
    }

    /**
     * 根据描述信息返回对应的SchedulingStatusEnum的编码
     * 如果不存在对应的SchedulingStatusEnum，则返回null
     *
     * @param value 描述信息
     * @return 编码
     */
    public static Integer getCodeByValue(String value) {
        SchedulingStatusEnum enumExample = getEnumExampleByValue(value);
        if (enumExample != null) {
            return enumExample.getCode();
        } else {
            return null;
        }
    }

}
